package com.cotasul.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;

import com.cotasul.bean.UsuarioBean;
import com.cotasul.persistencia.config.GerenciadorConexao;
import com.cotasul.persistencia.config.SQLConfiguracao;
import com.cotasul.persistencia.enums.EnumCondicao;
import com.cotasul.persistencia.interfaces.IUsuarioDao;

public class UsuarioDao<P extends UsuarioBean> extends DaoGenerico<P> implements
		IUsuarioDao<P> {

	private Connection conn;
	private String query;
	private PreparedStatement ps;
	private ResultSet rs;

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		return null;
	}

	@Override
	public void alterar(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	public Map<String, Long> salvar(P p) {
		return null;
	}

	public void preSalvar(P p) {
	};

	public P verLogin(final P p) throws Exception {
		ps = null;
		rs = null;
		conn = null;
		query = null;
		p.setNome(null);
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("localiza_usuario");
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getLogin());
			ps.setString(2, p.getSenha());
			rs = ps.executeQuery();
			if (rs.next()) {
				if (rs.getString("TIPO").equals("Comprador")) {
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_usuario_comp");
				} else if (rs.getString("TIPO").equals("Administrador")) {
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_usuario_adm");
				} else {
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_usuario_forn");
				}
			}
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getLogin());
			ps.setString(2, p.getSenha());
			rs = ps.executeQuery();
			if (rs.next()) {
				p.setCodigo(rs.getLong("IDUSER"));
				p.setLogin(rs.getString("LOGIN"));
				p.setTipo(rs.getString("TIPO"));
				if (!p.getTipo().equals("Administrador")) {
					p.setNome(rs.getString("RAZAO"));
				} else {
					p.setNome("Administrador");
				}
				p.setSenha(rs.getString("SENHA"));
				p.setAtivo(rs.getString("ATIVO"));
				p.setBloqueado(rs.getString("BLOQUEADO"));
				p.setEndereco(rs.getString("ENDERECO"));
				p.setUf(rs.getString("UF"));
				p.setCidade(rs.getString("CIDADE"));
			}
			return p;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	}

	public void trocarSenha(P p, String senhaNova) throws Exception {
		conn = null;
		ps = null;
		query = null;

		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("altera_senha");
			ps = conn.prepareStatement(query);
			ps.setString(1, senhaNova.trim());
			ps.setLong(2, p.getCodigo());
			ps.executeUpdate();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	}

	public boolean validaNomeUsuario(String login) throws Exception {
		query = SQLConfiguracao.getInstance().getValor("localiza_nome_usuario");
		conn = GerenciadorConexao.getConexao();
		boolean permite = true;
		try {
			ps = conn.prepareStatement(query);
			ps.setString(1, login);
			rs = ps.executeQuery();
			if (rs.next()) {
				permite = false;
			}
		} catch (Exception e) {
			throw e;
		}

		return permite;
	}

	public void exluir(P p) throws Exception {
	};

	public void alterarBloqueio(P p) throws Exception {
		conn = GerenciadorConexao.getConexao();
		query = SQLConfiguracao.getInstance().getValor(
				"altera_bloqueio_usuario");
		ps = conn.prepareStatement(query);
		if ("Sim".equals(p.getBloqueado().trim())) {
			ps.setString(1, "Não");
		} else {
			ps.setString(1, "Sim");
		}
		ps.setLong(2, p.getCodigo());
		ps.execute();
		conn.commit();

	}
}
